
const { ccclass, property } = cc._decorator;
/**
 * 最基本的ui节点组件基类
 */
export class BaseComponent extends cc.Component {

    private events = [];
    /**当附加到一个激活的节点上或者其节点第一次激活时候调用。onLoad 总是会在任何 start 方法调用前执行，这能用于安排脚本的初始化顺序。 */
    protected onLoad() {

    }
    /**如果该组件第一次启用，则在所有组件的 update 之前调用。通常用于需要在所有组件的 onLoad 初始化完毕后执行的逻辑。 */
    protected start() {
        //屏幕方向改变调用的
        cc.view.on('canvas-resize', this.resize, this);
    }
    /**当手指触摸到屏幕时。 */
    public addTouchStart(node: cc.Node, func: Function) {
        this.addEvent(cc.Node.EventType.TOUCH_START, node, func);
    }
    /**当手指在屏幕上移动时。 */
    public addTouchMove(node: cc.Node, func: Function) {
        this.addEvent(cc.Node.EventType.TOUCH_MOVE, node, func);
    }
    /**当手指在目标节点区域内离开屏幕时。 */
    public addTouchEnd(node: cc.Node, func: Function) {
        this.addEvent(cc.Node.EventType.TOUCH_END, node, func);
    }

    /**当手指在目标节点区域外离开屏幕时。 */
    public addTouchCancel(node: cc.Node, func: Function) {
        this.addEvent(cc.Node.EventType.TOUCH_CANCEL, node, func);
    }

    /**
     * @param ev事件
     * @param node事件对象
     * @param func事件处理函数
     */
    public addEvent(ev: string, node: cc.Node, func: Function) {
        if (!node) return;
        node.on(ev, func, this);
        this.events.push([ev, func, node]);
    }
    
    /**删除事件 */
    public removeEvent(ev: string, node: cc.Node, func: Function) {
        node.off(ev, func, this);
        let index = this.findEvent(ev, func);
        if (index != -1) {
            this.events.splice(index, 1);
        }
    }

    /**查找对应事件 */
    public findEvent(ev: string, func: Function) {
        let len = this.events.length;
        for (let i = 0; i < len; i++) {
            if (this.events[i][0] == ev && this.events[i][1] == func) {
                return i;
            }
        }
        return -1;
    }


    /**
     * 给对象添加点击缩放
     */
    public addClickScale(node: cc.Node) {
        if (!node) return;
        node.stopAllActions();

        let fun1 = () => {
            node.stopAllActions();
            let time1: number = Math.abs(1.1 - node.scaleX);
            cc.tween(node).to(time1, { scale: 1.1 }).start();

        }
        this.addTouchStart(node, fun1);
        let fun2 = () => {
            node.stopAllActions();
            let time2: number = Math.abs(node.scaleX - 1);
            cc.tween(node).to(time2, { scale: 1 }).start();
        }
        this.addTouchEnd(node, fun2);
        this.addTouchCancel(node, fun2);
    }

    /**如果该组件启用，则每帧调用 update */
    protected update(dt: number) { }

    protected lateUpdate(dt: number) { }
    /**当该组件被启用，并且它的节点也激活时。 */
    protected onEnable() { }
    /**当该组件被禁用或节点变为无效时调用。 */
    protected onDisable() { }

    /**舞台尺寸或UI组件尺寸发生改变 */
    protected resize(age?): void { }

    /**当该组件被销毁时调用 */
    protected onDestroy() {
        this.removeEvents();
    }


    /**移除所有注册了的事件 */
    public removeEvents() {
        cc.view.off('canvas-resize', this.resize, this);
        for (let ev of this.events) {
            ev[2].off(ev[0], ev[1], this);
        }
        this.events.length = 0;
    }


    /**
    * 设置顶部
    * @param node 自己
    * @param parent 要对比的节点
    * @param offset 偏移量
    */
    public setNode_top(node: cc.Node, parent: cc.Node, offset: number = 0) {
        if (node && parent) {
            node.y = parent.height / 2 - node.height * node.scale / 2 - offset;
        }
    }

    /**
     * 设置底部位置
     * @param node 自己
     * @param parent 要对比的节点
     * @param offset 偏移量
     */
    public setNode_bottom(node: cc.Node, parent: cc.Node, offset: number = 0) {
        if (node && parent) {
            node.y = -parent.height / 2 + node.height * node.scale / 2 + offset;
        }
    }

    /**
    * 设置左边
    * @param node 自己
    * @param parent 要对比的节点
    * @param offset 偏移量
    */
    public setNode_left(node: cc.Node, parent: cc.Node, offset: number = 0) {
        if (node && parent) {
            node.x = -parent.width / 2 + node.width * node.scale / 2 + offset;
        }
    }

    /**
    * 设置右边
    * @param node 自己
    * @param parent 要对比的节点
    * @param offset 偏移量
    */
    public setNode_right(node: cc.Node, parent: cc.Node, offset: number = 0) {
        if (node && parent) {
            node.x = parent.width / 2 - node.width * node.scale / 2 - offset;
        }
    }

    /**
     * 设置缩放为父节点大小
     * @param node 
     * @param parent 
     * @param offset 
     */
    public setNode_full(node: cc.Node, offset: number = 0) {
        if (node && node.parent) {
            let scaleX = node.parent.width / node.width;
            let scaleY = node.parent.height / node.height;
            node.scale = Math.max(scaleX, scaleY)
        }
    }



}
